# backend/modules/userinterface/models.py
from ...extensions import db, get_beijing_time

# 定义报告模型
class Report(db.Model):
    # 指定数据库表名
    __tablename__ = 'reports'

    # 定义模型字段
    id = db.Column(db.Integer, primary_key=True)  # 报告ID，主键
    report_type = db.Column(db.String(50), nullable=False, index=True)  # 报告类型，字符串类型，不能为空，并建立索引
    filepath = db.Column(db.String(255), nullable=False)  # 文件路径，字符串类型，不能为空
    timestamp = db.Column(db.DateTime, default=get_beijing_time, index=True)  # 时间戳，日期时间类型，默认值为北京时间，并建立索引
    forecast_id = db.Column(db.Integer, db.ForeignKey('forecasts.id'), nullable=False)  # 预测ID，整型，外键，不能为空
    uploaded_file_id = db.Column(db.Integer, db.ForeignKey('uploaded_files.id'), nullable=False)  # 上传文件ID，整型，外键，不能为空

    # 定义与UploadedFile模型的关系
    uploaded_file = db.relationship('UploadedFile', back_populates='reports')
    # 定义与Forecast模型的关系，确保Forecast模型中有对应的关系
    forecast = db.relationship('Forecast', back_populates='reports')

    # 定义模型的字符串表示
    def __repr__(self):
        return f"<Report {self.id} - {self.report_type}>"

# 定义需求预测模型
class DemandForecast(db.Model):
    # 指定数据库表名
    __tablename__ = 'demand_forecast'

    # 定义模型字段
    id = db.Column(db.Integer, primary_key=True)  # 预测ID，主键
    product_name = db.Column(db.String(100), nullable=False)  # 产品名称，字符串类型，不能为空
    forecast_quantity = db.Column(db.Integer, nullable=False)  # 预测数量，整型，不能为空
    forecast_date = db.Column(db.Date, nullable=False)  # 预测日期，日期类型，不能为空

    forecast_id = db.Column(db.Integer, db.ForeignKey('forecasts.id'), nullable=False)  # 预测ID，整型，外键，不能为空
    # 定义与Forecast模型的关系，单父关系，级联删除孤儿
    forecast = db.relationship('Forecast', back_populates='demand_forecasts', single_parent=True, cascade="all, delete-orphan")

    # 定义模型的字符串表示
    def __repr__(self):
        return f"<DemandForecast {self.product_name} - {self.forecast_quantity} on {self.forecast_date}>"

# 定义库存管理模型
class InventoryManagement(db.Model):
    # 指定数据库表名
    __tablename__ = 'inventory_management'

    # 定义模型字段
    id = db.Column(db.Integer, primary_key=True)  # 库存ID，主键
    product_name = db.Column(db.String(50), nullable=False)  # 产品名称，字符串类型，不能为空
    current_stock = db.Column(db.Integer, nullable=False)  # 当前库存，整型，不能为空
    uploaded_file_id = db.Column(db.Integer, db.ForeignKey('uploaded_files.id'), nullable=False)  # 上传文件ID，整型，外键，不能为空

    # 定义与UploadedFile模型的关系
    uploaded_file = db.relationship('UploadedFile', back_populates='inventory_records')

    # 定义模型的字符串表示
    def __repr__(self):
        return f"<InventoryManagement {self.product_name} - {self.current_stock} in stock>"
